package com.cheer.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.cheer.common.Page;
import com.cheer.dao.OaArticleClassDao;
import com.cheer.dto.OaArticleClassAddDTO;
import com.cheer.dto.OaArticleClassUpdateDTO;
import com.cheer.entity.OaArticleClassEntity;
import com.cheer.enums.OaArticleClassEnum;
import com.cheer.exception.ServiceException;
import com.cheer.service.OaArticleClassService;
import com.cheer.vo.ImageVO;
import com.cheer.vo.OaArticleClassInfoVO;
import com.cheer.vo.OaArticleClassListVO;
import com.cheer.vo.SimpleObjectVO;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;

import java.util.List;
import java.util.Objects;
import java.util.stream.Collectors;

@Service("oaArticleClassService")
public class OaArticleClassServiceImpl extends ServiceImpl<OaArticleClassDao, OaArticleClassEntity> implements OaArticleClassService {

    @Value("${image.url}")
    private String imageUrl;

    @Autowired
    private OaArticleClassDao oaArticleClassDao;

    @Override
    public List<SimpleObjectVO> listSimple() {
        List<OaArticleClassEntity> articleClassList = list();

        return articleClassList.stream()
                .map(articleClass -> new SimpleObjectVO()
                        .setId((long) articleClass.getId())
                        .setName(articleClass.getName()))
                .collect(Collectors.toList());
    }

    @Override
    public void add(OaArticleClassAddDTO articleClassAddDTO) {
        if (Objects.equals(articleClassAddDTO.getLocation(), OaArticleClassEnum.MAIN.getCode())) {
            throw new ServiceException("修改首页文章分类前需要与研发沟通");
        }

        OaArticleClassEntity articleClass = new OaArticleClassEntity()
                .setName(articleClassAddDTO.getName())
                .setLocation(articleClassAddDTO.getLocation())
                .setImgUrl(articleClassAddDTO.getImgUrl());

        oaArticleClassDao.insert(articleClass);
    }

    @Override
    public Page<OaArticleClassListVO> list(Integer pageNum, Integer pageSize) {
        IPage<OaArticleClassEntity> page = oaArticleClassDao.selectPage(pageNum, pageSize);

        List<OaArticleClassListVO> list = page.getRecords().stream()
                .map(articleClass -> new OaArticleClassListVO()
                        .setId(articleClass.getId())
                        .setName(articleClass.getName())
                        .setLocation(articleClass.getLocation())
                        .setStatus(articleClass.getStatus()))
                .collect(Collectors.toList());

        return new Page<>(page, list);
    }

    @Override
    public OaArticleClassInfoVO info(Integer id) {
        OaArticleClassEntity articleClass = oaArticleClassDao.selectById(id);
        if (articleClass == null) {
            throw new ServiceException("分类不存在");
        }

        OaArticleClassInfoVO oaArticleClassInfoVO = new OaArticleClassInfoVO()
                .setId(articleClass.getId())
                .setName(articleClass.getName())
                .setLocation(articleClass.getLocation())
                .setArticleId(articleClass.getArticleId());

        if (StringUtils.isNotBlank(articleClass.getImgUrl())) {
            oaArticleClassInfoVO.setImgUrl(new ImageVO()
                    .setFullUrl(imageUrl + articleClass.getImgUrl())
                    .setShortUrl(articleClass.getImgUrl()));
        } else {
            oaArticleClassInfoVO.setImgUrl(new ImageVO()
                    .setFullUrl("")
                    .setShortUrl(""));
        }

        return oaArticleClassInfoVO;
    }

    @Override
    public void update(OaArticleClassUpdateDTO articleClassUpdateDTO) {
        OaArticleClassEntity articleClass = oaArticleClassDao.selectById(articleClassUpdateDTO.getId());
        if (articleClass == null) {
            throw new ServiceException("分类不存在");
        }

        if (Objects.equals(articleClass.getLocation(), OaArticleClassEnum.MAIN.getCode())
                || Objects.equals(articleClassUpdateDTO.getLocation(), OaArticleClassEnum.MAIN.getCode())) {
            throw new ServiceException("修改首页文章分类前需要与研发沟通");
        }

        OaArticleClassEntity updateArticleClass = new OaArticleClassEntity()
                .setId(articleClassUpdateDTO.getId())
                .setName(articleClassUpdateDTO.getName())
                .setLocation(articleClassUpdateDTO.getLocation())
                .setImgUrl(articleClassUpdateDTO.getImgUrl())
                .setArticleId(articleClassUpdateDTO.getArticleId());

        oaArticleClassDao.updateById(updateArticleClass);
    }

    @Override
    public void updateStatus(Integer id, Integer status) {
        OaArticleClassEntity articleClass = oaArticleClassDao.selectById(id);
        if (articleClass == null) {
            throw new ServiceException("分类不存在");
        }

        if (Objects.equals(articleClass.getLocation(), OaArticleClassEnum.MAIN.getCode())) {
            throw new ServiceException("修改首页文章分类前需要与研发沟通");
        }

        OaArticleClassEntity updateArticleClass = new OaArticleClassEntity()
                .setId(id)
                .setStatus(status);

        oaArticleClassDao.updateById(updateArticleClass);
    }

    @Override
    public List<SimpleObjectVO> listByLocation(Integer location) {
        List<OaArticleClassEntity> list = oaArticleClassDao.selectListByLocation(location);

        return list.stream()
                .map(oaArticleClassEntity -> new SimpleObjectVO()
                        .setId((long) oaArticleClassEntity.getId())
                        .setName(oaArticleClassEntity.getName()))
                .collect(Collectors.toList());
    }

    @Override
    public OaArticleClassEntity getByUsed(Integer id) {
        return oaArticleClassDao.selectByIdAndStatus(id, true);
    }

}